import { app, BrowserWindow, Tray, Menu, ipcMain, Notification, shell } from 'electron';
import { join } from 'path';
import { electronApp, optimizer, is } from '@electron-toolkit/utils';
let mainWindow;
let tasks = []; // 用于存储任务
let tray;
let isVisible = false; // 使用布尔变量来跟踪窗口的可见状态
let isFixed = false;
let reminders = []; // 用于存储提醒定时器

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1040,
    height: 670,
    show: false, // 窗口创建后不立即显示
    autoHideMenuBar: true, // 自动隐藏菜单栏
    frame: false, // 是否显示窗口边框
    transparent: true, // 是否透明
    alwaysOnTop: false, // 是否置顶
    movable: true,
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      sandbox: false, // 禁用沙盒模式
    },
    skipTaskbar: true // 是否不在任务栏中显示窗口
  });

  // 当窗口准备好显示时，显示窗口。
  mainWindow.on('ready-to-show', () => {
    mainWindow.show();
  });

  // 拦截窗口打开请求，使用 shell.openExternal 打开外部链接。
  mainWindow.webContents.setWindowOpenHandler((details) => {
    shell.openExternal(details.url);
    return { action: 'deny' };
  });

  // 开发环境加载 Vite 开发服务器，生产环境加载构建后的 HTML 文件。
  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']);
  } else {
    mainWindow.loadFile(join(__dirname, '../renderer/index.html'));
  }

  // 设置托盘图标
  const iconPath = join(__dirname, '../../resources/tray-icon.png'); // 确保路径正确
  tray = new Tray(iconPath);
  const contextMenu = Menu.buildFromTemplate([
    {
      label: '显示/隐藏',
      click: () => {
        toggleWindowVisibility();
      }
    },
    {
      label: '退出',
      click: () => {
        app.quit();
      }
    }
  ]);
  tray.setToolTip('我的待办事项');
  tray.setContextMenu(contextMenu);

  // 添加托盘图标点击事件监听器
  tray.on('click', () => {
    toggleWindowVisibility();
  });

  // 监听固定位置按钮的点击事件
  ipcMain.on('toggle-fix', (event, isFixedNew) => {
    isFixed = isFixedNew;
    mainWindow.setMovable(!isFixed); // 设置窗口是否可拖动
  });

  // 监听窗口的显示和隐藏事件，更新布尔变量
  mainWindow.on('show', () => {
    isVisible = true;
  });
  mainWindow.on('hide', () => {
    isVisible = false;
  });

  // 监听窗口关闭事件，确保托盘图标被清理
  mainWindow.on('close', () => {
    tray.destroy();
  });
}

function toggleWindowVisibility() {
  if (isVisible) {
    mainWindow.hide();
  } else {
    mainWindow.show();
  }
}

app.whenReady().then(() => {
  electronApp.setAppUserModelId('备忘录'); // 设置应用用户模型 ID
  app.on('browser-window-created', (_, window) => {
    optimizer.watchWindowShortcuts(window); // 监听窗口快捷键
  });
  createWindow();

  app.on('activate', function () {
    // macOS 应用激活时创建新窗口
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
  app.setLoginItemSettings({
    openAtLogin: true, // 设置应用开机自启
    path: process.execPath // 应用的可执行文件路径
  });
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

// 监听任务数据更新
ipcMain.on('update-tasks', (event, newTasks) => {
  tasks = newTasks;
  setupReminders();
});

// 设置提醒功能
function setupReminders() {
  // 清除已有的提醒
  reminders.forEach(timeout => clearTimeout(timeout));
  reminders = [];

  // 设置新的提醒
  tasks.forEach((task) => {
    if (task.dueDate) {
      const now = new Date();
      const dueDate = new Date(task.dueDate);
      dueDate.setDate(dueDate.getDate() - 2); // 预期完成日前两天提醒
      if (now < dueDate) {
        const timeUntilReminder = dueDate - now;
        const reminder = setTimeout(() => {
          // 创建系统通知
          new Notification({
            title:'任务提醒',
            body: `任务 "${task.title}" 的预期完成时间即将到来！`,
            icon: join(__dirname, '../../resources/icon.png') // 确保图标路径正确
          }).show()
        }, timeUntilReminder);
        reminders.push(reminder);
      }else{
        // 创建系统通知
        new Notification({
          title:'任务提醒',
          body: `任务 "${task.title}" 的预期完成时间即将到来！`,
          icon: join(__dirname, '../../resources/icon.png') // 确保图标路径正确
        }).show()
      }
    }
  });
}